package br.com.ds3.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.ds3.model.Perfil;
import br.com.ds3.model.Usuario;
import br.com.ds3.util.DS3Util;

@Component
public class UsuarioDAO extends GenericDAO<Usuario> {
	private final Long TAMANHO_PAGINA = new Long(10);

	@Override
	public Class<Usuario> getModelClass() {
		return Usuario.class;
	}
	
    private Criteria createCriteriaPesquisa(String nome) {
        Criteria criteria = getSession().createCriteria(getModelClass());
        
        if (!DS3Util.isEmtpy(nome)) {
        	criteria.add(Restrictions.like("nome", nome.toUpperCase() + "%"));
        }
        
        return criteria;
    }
    
    public Long countPaginas(String nome) {
    	Criteria criteria = createCriteriaPesquisa(nome);    	
    	Long quantidadeRegistros = countCriteria(criteria);    	
    	Long paginas = countPaginas(quantidadeRegistros, TAMANHO_PAGINA);    	
    	return paginas;
    }
	
	public List<Usuario> pesquisa(String nome, Long pagina) {
		Criteria criteria = createCriteriaPesquisa(nome);
		criteria.addOrder(Order.asc("nome"));
		return executaCriteria(criteria, pagina, TAMANHO_PAGINA);
	}
	
	public Usuario autenticar(String nomeUsuario, String senha)
	{
		if(nomeUsuario == null || senha == null) return null;
		if(nomeUsuario.equalsIgnoreCase("Admin") && senha.equalsIgnoreCase("Test")) return administrador();		
		Criteria criteria = getSession().createCriteria(getModelClass());
		criteria.add(Restrictions.like("nomeUsuario", nomeUsuario.toUpperCase()));
		criteria.setMaxResults(1);
		try {
			Usuario user = (Usuario) criteria.uniqueResult();
			if(user != null && user.senhaCorreta(senha)) return user;
			else return null;
		} catch (Exception e) {
			System.out.println(e.toString());
			return null;
		}
	}
	
	private Usuario administrador()
	{
		Usuario adm = new Usuario();
		adm.setNome("Administrador");
		adm.setNomeUsuario("ADMIN");
		adm.setPerfil(Perfil.ADMINISTRADOR);
		return adm;
	}
	
	public Usuario getByNomeUsuario(String nomeUsuario) {
        Criteria criteria = getSession().createCriteria(getModelClass());
        criteria.add(Restrictions.eq("nomeUsuario", nomeUsuario.toUpperCase()));

        return (Usuario) criteria.uniqueResult();
	}
}
